Proprietati:
|- pt orice nod stang tatal este mai mare
|- pt orice nod stang tatal este mai mic
|- pt orice nod fiul stang este mai mic si cel drept este mai mare

Probleme tipice:
*Sa se afle al i-lea arbore de cautare binara cu X noduri.

- Nr. de arbori de cautare binara cu X noduri este egal cu: Best[i]= Best[j]*Best[i-j-1] , i in (1,n) , j in (0,i-1)  
- Pentru a afla al i-lea arbore trebuie sa facem divide et impera

Code:

#include <fstream>
using namespace std;

ifstream F("SeekArb.in");
ofstream G("SeekArb.out");

#define Dmax 1011
typedef int Arb[Dmax];

Arb A;
int N,x;
int Size;

int UpArb(Arb A,int Size,int& Nod)
{
	if ( Nod % 2 == 0 && Nod!=1 )
	{
		if ( A[Nod] > A[Nod/2] && Nod/2>0 )
		{
			swap(A[Nod],A[Nod/2]);
			Nod/=2;
			return UpArb(A,Size,Nod);
		}
		else
			if ( A[Nod] < A[Nod/4] && Nod/4>0 )
			{
				swap(A[Nod],A[Nod/4]);
				Nod/=4;
				return UpArb(A,Size,Nod);
			}
	}
	else
	{
		if ( A[Nod] < A[Nod/2] && Nod/2>0 )
		{
			swap(A[Nod],A[Nod/2]);
			Nod/=2;
			return UpArb(A,Size,Nod);
		}
		else
			if ( A[Nod] > A[Nod/4] && Nod/4>0 )
			{
				swap(A[Nod],A[Nod/4]);
				Nod/=4;
				return UpArb(A,Size,Nod);
			}
	}
	
	return Nod;
}

void DownArb(Arb A,int Size,int& Nod)
{
	if ( A[Nod] < A[Nod*2] && Nod*2<=Size )
	{
		swap(A[Nod],A[Nod*2]);
		Nod*=2;
		DownArb(A,Size,Nod);
	}
	else
		if ( A[Nod] > A[Nod*2+1] && Nod*2<Size )
		{
			swap(A[Nod],A[Nod*2+1]);
			Nod=Nod*2+1;
			DownArb(A,Size,Nod);
		}
}

void Insert(Arb A,int& Size,int Val)
{
	A[++Size]=Val;
	int Nod=Size;
	
	Nod=UpArb(A,Size,Nod);
	DownArb(A,Size,Nod);
}

void Earse(Arb A,int& Size,int Nod)
{
	swap(A[Nod],A[Size--]);
	
	Nod=UpArb(A,Size,Nod);
	DownArb(A,Size,Nod);
}

int Seek(Arb A,int Size,int Val)
{
	int Nod=1,Stop=0;
	
	while ( !Stop )
	{
		Stop=1;
		if ( A[Nod]==Val )
			return Nod;
		if ( A[Nod*2]>=Val && Nod*2<=Size )
			Nod*=2,Stop=0;
		else
			if ( A[Nod*2]<=Val && Nod*2<Size )
				Nod*=2,++Nod,Stop=0;
	}
	
	return false;
}

int main()
{
	F>>N;
	for (int i=1;i<=N;++i)
	{
		F>>x;
		if ( x==1 )
		{
			F>>x;
			Insert(A,Size,x);
			continue;
		}
		if ( x==2 )
		{
			F>>x;
			Earse(A,Size,Seek(A,Size,x));
			continue;
		}
		if ( x==3 )
		{
			F>>x;
			G<<( Seek(A,Size,x)>0 )<<'\n';
			continue;
		}
	}
}
